package com.alipay.sdk.pay.demo;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Random;



import com.alipay.sdk.app.PayTask;
import com.alipay.sdk.pay.demo.interfaces.WebAppInterface;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public abstract class PayDemoActivity extends FragmentActivity {

	// 商户PID
//	public static final String PARTNER = "2088221857105591";
	public static final String PARTNER = "2088521239646448";
	// 商户收款账号
//	public static final String SELLER = "yiyitehao@qq.com";
	public static final String SELLER = "3250556087@qq.com";
	// 商户私钥，pkcs8格式
//	public static final String RSA_PRIVATE = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ/18KgAavV64vDJVbt8Vd7trzdAb2ooRVYlWNFmsTdhe2snSTktIeryR9lMpF1mKEW2iYvc3SKZSUEF8ClThzRrl/X25kNS4fKNuqm/emt3dn9YHyK470zjye8s4dwrUcBRN8yoMnaptQC/NaumbQWXYOTwlGsN2zH0ix3pbwszAgMBAAECgYAmPLIkVsU6nP92s4oM4THdsk96E6sOY0X/y7mphLTEGkdYW/HC+yjqcrP+G7YGpY7m6zWB+2/Y/29lXbgFCPR+kJ5mz55M1RvJdOcqL+tVQPikypc/bscxyg0BTfTG97umEzZ1dnsJ0cK9MJegwIk2eO2PY+prds8f5Hyth6E8gQJBAM4cwfKlGJN8gNMpwmCP+545cuW7iIksRKMe+tT35x14BAzfs2hSITjVGTZx61BCwefn0l78DKNmZ8t235FGByECQQDGrYKutPxIfPda7XmKbHXbbgsN0z6T7DPc8PhpuXETKuvWlqQy9WitfbYhLmd4jCGYds/wLkJ8MWuNPabTEMvTAkEAlloWBOn4HoZg9yjsOUJu+0HPFdSSSfY374JG2ZopRq7ozXdVyVC4GVwh8zxwunCoQII0TMOyeHPYXWzOs4uQ4QJBAI+uxCfdM+aomarku1VkgweiWdQxxbvswsUycDTlq+UU0WJrp2xDFuUBWUo96Q7BKTq+Eju8+NAgXYvT3mYea4kCQC8GOLJpICMluRZw/olef9Qi7Cfw0yy/XHEEyGpb77tnSePsEPKG0PUvT1QAtsfybAanleVfGYnav6dAMc8Xh2U=";
	public static final String RSA_PRIVATE = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJj3hDL/dCe1FAdfzFWwwj91okGTJz6uIE8gwatwbSFNSKJ6R2cdrj2e7Viaj4rMyHT9ZWlyAbthMYP7ePHr+CvW5U6QE7VUTFmLGB+bBS2GxecPgFs7Tq9cgnyDT8hklunCvXm/zQ7jceD4OSevNbQcxZWd6+v0sBF7xta6/vkbAgMBAAECgYEAlfQe/rd6MOrMpaX99AsBgaBZ3ZraIBImzis4cE4YTUsr50uj76wjAXlpBzENgm3aHQXDgqkmlYBkQBQnrlE6yIs3bTFpgXetOJ3/zzL/aMUQJkAOht9XGR1mDPd9r2EqxgCkark4p+5QLVvhm09VVsAbsz8paln8EsnZUNh/GlECQQDGZg4GTlu0xzn0eGOGjto/0DcKI4jTjUECScn5P40eEntXTe7QsbqZq/EO5tM9t7dwMaRJ6+rLE6QZwPWeZu5FAkEAxWDAb2nVlwOSelbHP/DOtHJ7jsqOb2HkePBRc0jLbhGUgfKPx+RYD9HMAE8zfHq0CyP/4n1bTnOlGuNSRwfv3wJANHBBALWxU4Tc8prnY2dalEdKZOmjfpb1Oc+bDMAZYntsElVM6+gt8/QYUOH9r3BhkcvtKoSqmGZml1ADG40FKQJAa1lf0DjDjkrHE/q2i7Qw+Dt7sAHCzhlz5cLuycDBw6+UEckXIiSzMIduaIyq9/zUh2qg9VIwos6K8cDJMxDCCQJBAIHFOPqrWlZzfvP9ZqmFq5N7SHQkzyTXk2yswvB2GOhD3tdmMbB0UIcRUR4ZfTwiFjyWtzv0ystipPcafM0w6n8=";
	// 支付宝公钥
//	public static final String RSA_PUBLIC = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB";
	public static final String RSA_PUBLIC = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB";
	private static final int SDK_PAY_FLAG = 1;

	@SuppressLint("HandlerLeak")
	private Handler mHandler = new Handler() {
		@SuppressWarnings("unused")
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case SDK_PAY_FLAG: {
				PayResult payResult = new PayResult((String) msg.obj);
				/**
				 * 同步返回的结果必须放置到服务端进行验证（验证的规则请看https://doc.open.alipay.com/doc2/
				 * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
				 * docType=1) 建议商户依赖异步通知
				 */
				String resultInfo = payResult.getResult();// 同步返回需要验证的信息

				String resultStatus = payResult.getResultStatus();
				// 判断resultStatus 为“9000”则代表支付成功，具体状态码代表含义可参考接口文档
				if (TextUtils.equals(resultStatus, "9000")) {
					Toast.makeText(PayDemoActivity.this, "支付成功",
							Toast.LENGTH_SHORT).show();
				} else {
					// 判断resultStatus 为非"9000"则代表可能支付失败
					// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
					if (TextUtils.equals(resultStatus, "8000")) {
						Toast.makeText(PayDemoActivity.this, "支付结果确认中",
								Toast.LENGTH_SHORT).show();

					} else {
						// 其他值就可以判断为支付失败，包括用户主动取消支付，或者系统返回的错误
						Toast.makeText(PayDemoActivity.this, "支付失败",
								Toast.LENGTH_SHORT).show();

					}
				}
				break;
			}
			default:
				break;
			}
		}

		;
	};

	/*
	 * protected App mApp;
	 * 
	 * @Override protected void onCreate(Bundle savedInstanceState) {
	 * super.onCreate(savedInstanceState);
	 * this.setContentView(this.getLayoutId()); mApp = App.getInstance();
	 * 
	 * this.initView();
	 * 
	 * } public abstract int getLayoutId(); public abstract void initView();
	 */

	/**
	 * call alipay sdk pay. 调用SDK支付
	 */
	public void pay(View v) {
		if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE)
				|| TextUtils.isEmpty(SELLER)) {
			new AlertDialog.Builder(this)
					.setTitle("警告")
					.setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER")
					.setPositiveButton("确定",
							new DialogInterface.OnClickListener() {
								public void onClick(
										DialogInterface dialoginterface, int i) {
									//
									finish();
								}
							}).show();
			return;
		}
		String orderInfo = getOrderInfo(getShoppingName(),
				getShoppingNameDetail(), getShoppingPrice());

		/**
		 * 特别注意，这里的签名逻辑需要放在服务端，切勿将私钥泄露在代码中！
		 */
		String sign = sign(orderInfo);
		try {
			/**
			 * 仅需对sign 做URL编码
			 */
			sign = URLEncoder.encode(sign, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		/**
		 * 完整的符合支付宝参数规范的订单信息
		 */
		final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
				+ getSignType();

		Runnable payRunnable = new Runnable() {
			@Override
			public void run() {
				// 构造PayTask 对象
				PayTask alipay = new PayTask(PayDemoActivity.this);
				// 调用支付接口，获取支付结果
				String result = alipay.pay(payInfo, true);

				Message msg = new Message();
				msg.what = SDK_PAY_FLAG;
				msg.obj = result;
				mHandler.sendMessage(msg);
			}
		};

		// 必须异步调用
		Thread payThread = new Thread(payRunnable);
		payThread.start();
	}

	/**
	 * get the sdk version. 获取SDK版本号
	 */
	public void getSDKVersion() {
		PayTask payTask = new PayTask(this);
		String version = payTask.getVersion();
		Toast.makeText(this, version, Toast.LENGTH_SHORT).show();
	}

	/**
	 * 原生的H5（手机网页版支付切natvie支付） 【对应页面网页支付按钮】
	 * 
	 * @param v
	 */
	public void h5Pay(View v) {
		Intent intent = new Intent(this, H5PayDemoActivity.class);
		Bundle extras = new Bundle();
		/**
		 * url是测试的网站，在app内部打开页面是基于webview打开的，demo中的webview是H5PayDemoActivity，
		 * demo中拦截url进行支付的逻辑是在H5PayDemoActivity中shouldOverrideUrlLoading方法实现，
		 * 商户可以根据自己的需求来实现
		 */
		String url = "http://m.taobao.com";
		// url可以是一号店或者淘宝等第三方的购物wap站点，在该网站的支付过程中，支付宝sdk完成拦截支付
		extras.putString("url", url);
		intent.putExtras(extras);
		startActivity(intent);
	}

	/***
	 * 商品名称
	 * **/
	protected String getShoppingName() {
		return "测试商品";
	}

	/***
	 * 商品名称详细描述
	 * **/
	protected String getShoppingNameDetail() {
		return "测试商品详细描述";
	}

	/***
	 * 商品价格
	 * **/
	protected String getShoppingPrice() {
		return "0.01";
	}

	/**
	 * create the order info. 创建订单信息
	 */
	private String getOrderInfo(String subject, String body, String price) {

		// 签约合作者身份ID
		String orderInfo = "partner=" + "\"" + PARTNER + "\"";

		// 签约卖家支付宝账号
		orderInfo += "&seller_id=" + "\"" + SELLER + "\"";

		// 商户网站唯一订单号
		orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";

		// 商品名称
		orderInfo += "&subject=" + "\"" + subject + "\"";

		// 商品详情
		orderInfo += "&body=" + "\"" + body + "\"";

		// 商品金额
		orderInfo += "&total_fee=" + "\"" + price + "\"";

		// 服务器异步通知页面路径
		orderInfo += "&notify_url=" + "\"" + getNotifyUrld() + "\"";

		// 服务接口名称， 固定值
		orderInfo += "&service=\"mobile.securitypay.pay\"";

		// 支付类型， 固定值
		orderInfo += "&payment_type=\"1\"";

		// 参数编码， 固定值
		orderInfo += "&_input_charset=\"utf-8\"";

		// 设置未付款交易的超时时间
		// 默认30分钟，一旦超时，该笔交易就会自动被关闭。
		// 取值范围：1m～15d。
		// m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
		// 该参数数值不接受小数点，如1.5h，可转换为90m。
		orderInfo += "&it_b_pay=\"30m\"";

		// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
		// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

		// 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
		orderInfo += "&return_url=\"m.alipay.com\"";

		// 调用银行卡支付，需配置此参数，参与签名， 固定值 （需要签约《无线银行卡快捷支付》才能使用）
		// orderInfo += "&paymethod=\"expressGateway\"";

		return orderInfo;
	}

	/**
	 * get the out_trade_no for an order. 生成商户订单号，该值在商户端应保持唯一（可自定义格式规范）
	 */
	protected String getOutTradeNo() {
		SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss",
				Locale.getDefault());
		Date date = new Date();
		String key = format.format(date);

		Random r = new Random();
		key = key + r.nextInt();
		key = key.substring(0, 15);
		return key;
	}

	protected String getNotifyUrld() {
		return "http://kw.runfkj.com/appservice/notifyurl.action";
	}

	/**
	 * sign the order info. 对订单信息进行签名
	 * 
	 * @param content
	 *            待签名订单信息
	 */
	private String sign(String content) {
		return SignUtils.sign(content, RSA_PRIVATE);
	}

	/**
	 * get the sign type we use. 获取签名方式
	 */
	private String getSignType() {
		return "sign_type=\"RSA\"";
	}
	
	public void showToast(String text) {
		Toast.makeText(getApplicationContext(), ""+text, Toast.LENGTH_SHORT).show();
	}
	public void showAsynToast(final String text){
		this.runOnUiThread(new Runnable() {
			public void run() {
				Toast.makeText(PayDemoActivity.this, text, Toast.LENGTH_SHORT).show();
			}
		});
	}


}
